package com.bw.system.server.controller;

import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayConfig;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradePagePayModel;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.alipay.api.response.AlipayTradePagePayResponse;
import com.bw.cart.common.domain.vo.CartItem;
import com.bw.common.core.domain.Result;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;

@RestController
@AllArgsConstructor
@Component
public class ApiPayController {

    private final AlipayConfig aliPayConfig;

    //明确性，不可变性，更好的空值处理，便于测试，避免循环依赖，性能优化，面向接口编程
    //1. 容易导致隐式依赖，2. 会导致强耦合，3. 容易导致 NullPointerException，4.自动装配容易搞出迷惑行为

    /**
     * 隐式依赖让代码可读性差。
     *
     * 强耦合违背面向接口编程。
     *
     * 字段注入容易 NPE。
     *
     * 自动装配有坑。
     * @return
     * @throws Exception
     */

    @GetMapping("/pay")
    public Result pay(CartItem cartItem) throws AlipayApiException {

        DefaultAlipayClient alipayClient  = new DefaultAlipayClient(aliPayConfig);
        AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
        AlipayTradePagePayModel model = new AlipayTradePagePayModel();

        // 设置商户订单号
        model.setOutTradeNo("20150320010101001");
        // 设置订单总金额
        model.setTotalAmount(cartItem.getSumPrice().toString());
        // 设置订单标题
        model.setSubject(cartItem.getSkuTitle());
        // 设置产品码
        model.setProductCode("FAST_INSTANT_TRADE_PAY");
        // 设置PC扫码支付的方式
        model.setQrPayMode("1");
        // 设置商户自定义二维码宽度
        model.setQrcodeWidth(100L);
        request.setBizModel(model);

        // 第三方代调用模式下请设置app_auth_token
        // request.putOtherTextParam("app_auth_token", "<-- 请填写应用授权令牌 -->");
//        AlipayTradePagePayResponse response = alipayClient.pageExecute(request, "POST");
        // 如果需要返回GET请求，请使用

        AlipayTradePagePayResponse response = alipayClient.pageExecute(request, "GET");
        String pageRedirectionData = response.getBody();
        System.out.println(pageRedirectionData);

        if (response.isSuccess()) {
            System.out.println("调用成功");
        } else {
            System.out.println("调用失败");
            // sdk版本是"4.38.0.ALL"及以上,可以参考下面的示例获取诊断链接
            // String diagnosisUrl = DiagnosisUtils.getDiagnosisUrl(response);
            // System.out.println(diagnosisUrl);
        }
        return Result.success(pageRedirectionData);
    }

    @PostMapping("/notify")
    public Result options(HttpServletRequest request){

        System.out.println("支付成功");

        return Result.success();
    }

}
